package com.yuan.java反射机制;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.sql.Date;
import java.util.Arrays;
import java.util.List;

/*
 *  @author 雨安
 *  类名： JavaClazzDemo1
 *  创建时间：2024/5/12
 */
public class JavaClazzDemo1 {
    //需要抛出类找不到的异常
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
        //指定反射路径
        Class<?> clazz = Class.forName("com.yuan.javaT和V的用法复习.TDemo1");
        //反射类名
        String simpleName = clazz.getSimpleName();
        //打印类名
        System.out.println(simpleName);
        //反射所有字段
        Field[] declaredFields = clazz.getDeclaredFields();
        //打印所有反射的字段
        Arrays.stream(declaredFields).forEach(System.out::println);
        //反射所有 方法
        Method[] declaredMethods = clazz.getDeclaredMethods();
        //打印所有 方法
        Arrays.stream(declaredMethods).forEach(System.out::println);
        System.out.println("--------------------------------------");
        //反射所有构造函数
        Constructor<?> declaredConstructor = clazz.getDeclaredConstructor();
        //获取所有公开的构造函数
        Constructor<?>[] constructors = clazz.getConstructors();
        //获取所有方法
        Method[] methods = clazz.getMethods();
//        Arrays.stream(methods).forEach(System.out::println);
        //获取无参构造方法
        Constructor<?> declaredConstructor1 = clazz.getDeclaredConstructor();
        //获取对象
        Object obj = declaredConstructor.newInstance();
        //反射对象
        Method method = clazz.getMethod("setMsg", String.class);
        //调用方法
        method.invoke(obj,"我是测试");
        //打印数据 打印反射后的数据
        System.out.println(obj.toString());


    }
}
